package Componentes;

import javax.swing.ImageIcon;
import javax.swing.JOptionPane;

import Graficos.ComponenteGrafico;
import Juegos.Posicion;

/**
 * ProyectoX TDP 2011
 * @author  Ma Gimena Ramos- LU:82716
 * @autor Brenda Dilschneider- LU: 92774
 *
 */

public class KoombaTroopa extends Enemigo implements Runnable{
	  int cantidadPisadas;
	  int controlPos;
	  Thread hilo;
	 
	  
	/**
	 * constructor	
	 */
	 public KoombaTroopa(){
		 super();
		cantidadPisadas=0;
		puntaje=90;
		puntaje = 60;
		controlPos=0;
		hilo= new Thread(this);
		visible = true;
		transitable=false;
		pm=true;
	 }
	 
	 /**
	  * retorna el puntaje del koomba
	  */
	 public int obtenerPuntaje(){
		 return puntaje;
	 }
	 
	 /**
	  * retorna la cantidad de pisadas 
	  * @return
	  */
	 public int obtenerCantidadPisadas(){
		 return cantidadPisadas;
	 }
	 
	 /**
	  * aumenta en 1 las pisadas
	  */
	 public void aumentarCantidadDePisadas(){
		 cantidadPisadas ++;
	 }
	 
	 
	 /**
	  * clona el objeto y devuelve un clon del tipo KoombaTroopa
	  */
	 public Object clonar()
		{
			KoombaTroopa v = new KoombaTroopa();
	
		ComponenteGrafico c=  new ComponenteGrafico(new ImageIcon(getClass().getClassLoader().getResource("Dibujos/greenparatroopa2.gif")));
			
			v.setGrafico(c);
			setPersonaje(mario);
			return v;
		}

	 public void goCaparazon(){
			
		 this.comp.setIcon(new ImageIcon(getClass().getClassLoader().getResource("Dibujos/caparazon.png")));
		}
	 
	 public void goKoopa(){
		 if (sentido==0)
		 this.comp.setIcon(new ImageIcon(getClass().getClassLoader().getResource("Dibujos/greenparatroopa2.gif")));
		 else
			 this.comp.setIcon(new ImageIcon(getClass().getClassLoader().getResource("Dibujos/greenparatroopa2i.gif")));
		}
	 
	 
	 /**
	  * si el mario esta chiquito lo mata, si esta grande lo convierte en chiquito 
	  * y si es invencible muere el troopa 
	  */
	@Override
	public void chocarMario() {
	
		Posicion posJugador= mario.obtenerPartida().obtenerPosicionActual();
		Posicion posMalo = this.obtenerPosicion();
			if (posJugador.getX()==posJugador.getX()){
			
				if (mario.invencible()){
					if (!destruido){
						 this.comp.setIcon(new ImageIcon(getClass().getClassLoader().getResource("Dibujos/GoombaM.png")));
							mario.obtenerPartida().aumentarPuntaje(60);
						
				 try {
							hilo.sleep(100);
						} catch (InterruptedException e) {
						
							e.printStackTrace();
						}
					destruirHilo();
						
				}}	
				else
				{	mario.obtenerPartida().disminuirPuntaje(30);
				if (mario.estachiquito())
				{
					mario.goQuieto();
			        mario.morir();
			    mario.obtenerPartida().disminuirVidas();
	         JOptionPane dialogo= new JOptionPane();
			 	if (mario.obtenerPartida().getVidas()==0){
					 dialogo.showMessageDialog (null, "Juego terminado.", "Gracias por jugar", JOptionPane.WARNING_MESSAGE);
					 mario.CambiaMario();}
					else {
						dialogo.showMessageDialog (null, "Ha perdido una vida", "Aceptar", JOptionPane.WARNING_MESSAGE);
						mario.goQuieto();
						mario.goDerecha();
				}
			 	}
				else{
					mario.MarioPequeño();
					mario.obtenerPartida().aumentarPosicionActual(1, 1); 
					mario.setBounds(16*mario.obtenerPartida().obtenerPosicionActual().getX(),16*mario.obtenerPartida().obtenerPosicionActual().getY()+16, 16, 16);
					mario.setLocation (16*mario.obtenerPartida().obtenerPosicionActual().getX(),16*mario.obtenerPartida().obtenerPosicionActual().getY());
				
				 
				   
				}
				}
			}	
		
		}


	/**
	 * inicia el hilo de ejecucion del troopa
	 */
	@Override
	public void arrancarHilo() {
				hilo.start();

	}

	/**
	 * para la ejecucion del hilo
	 */
	@Override
	public void destruirHilo() {
		destruido=true;
	this.comp.setIcon(null);
		hilo.stop();
	}

	/**
	 *  segun la cantidad de pisadas muere o queda como caparazon
	 */
	@Override
	public void pisadoPorMario() {
		cantidadPisadas ++;
				
		if (!destruido){
			if (cantidadPisadas<2){
				this.goCaparazon();
				hilo.stop();
				
			}
			else {
				  mario.obtenerPartida().aumentarPuntaje(60);
					destruido=true;
					this.comp.setIcon(null);
					
					mario.setLocation(mario.getLocation().x, mario.getLocation().y+16);
					mario.obtenerPartida().aumentarPosicionActual(0, 1);
					
			}
				
		}
	}

	/**
	 * cambia el sentido  del troopa
	 */
	@Override
	public void serChocado() {
		if (sentido==1)	
		{
			sentido=2;
			 this.comp.setIcon(new ImageIcon(getClass().getClassLoader().getResource("Dibujos/greenparatroopa2.gif")));
				
		}
			else{
				sentido=1;
				this.comp.setIcon(new ImageIcon(getClass().getClassLoader().getResource("Dibujos/greenparatroopa2i.gif")));
				
			}
	}

	/**
	 * si es alcanzado por un tiro llama a pisadoPorMario
	 */
	@Override
	public void serChocado(Componente c) {
		if (!destruido){
	    if (!c.obtenerPM()){
		if (!c.esVisible())
		{this.pisadoPorMario();
		 c.destruirHilo();
		}
	} }
		}

/**
 * se desplaza por todo el nivel controlando 
 * los componentes de su alrededor y controlando si choca con mario
 */
	public void run() {
		// TODO Auto-generated method stub
		this.goKoopa();
		{mario.repaint();
			while( true ) {
				if (sentido==1){
				this.comp.setLocation(this.comp.getLocation().x-1, this.comp.getLocation().y);
				controlPos+=1;
		if (controlPos==16)
			{controlPos=0;
		     this.setPosicion(this.obtenerPosicion().getX()-1,this.obtenerPosicion().getY());
		     if (this.obtenerPosicion().getX()== mario.obtenerPartida().obtenerPosicionActual().getX() && this.obtenerPosicion().getY()== mario.obtenerPartida().obtenerPosicionActual().getY()+1){
			    	 chocarMario();}
		    
			Componente c1= mario.obtenerPartida().getComponente(this.obtenerPosicion().getX()-1,this.obtenerPosicion().getY())	;
			if (c1!=null)
				c1.serChocado(this);
			if (this.obtenerPosicion().getX()==mario.obtenerPartida().obtenerPosicionActual().getX() && this.obtenerPosicion().getY()==mario.obtenerPartida().obtenerPosicionActual().getY()){
								chocarMario();
			}
		     try {
				hilo.sleep(400);				
			
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			gravedad.Caida(this);}
			}else//va hacia la derecha
			{
				this.comp.setLocation(this.comp.getLocation().x+1, this.comp.getLocation().y);
				controlPos+=1;
		if (controlPos==16)
			{controlPos=0;
		     this.setPosicion(this.obtenerPosicion().getX()+1,this.obtenerPosicion().getY());
		     if (this.obtenerPosicion().getX()== mario.obtenerPartida().obtenerPosicionActual().getX() && this.obtenerPosicion().getY()== mario.obtenerPartida().obtenerPosicionActual().getY()+1)
		    	 chocarMario();
		    
			Componente c1= mario.obtenerPartida().getComponente(this.obtenerPosicion().getX()+1,this.obtenerPosicion().getY())	;
			if (c1!=null)
				c1.serChocado(this);
			if (this.obtenerPosicion().getX()==mario.obtenerPartida().obtenerPosicionActual().getX() && this.obtenerPosicion().getY()==mario.obtenerPartida().obtenerPosicionActual().getY()){
				chocarMario();
			}
		     try {
				hilo.sleep(400);				
			
			} catch (InterruptedException e) {
						e.printStackTrace();
			}
			
			gravedad.Caida(this);}
			}
		
	}}
		
	}

	


	}
	 
